package cn.smile.business.basic;

import cn.smile.bean.dto.basic.VoucherMemberDTO;
import cn.smile.bean.entity.basic.VoucherMember;
import cn.smile.bean.form.basic.voucher.AddVoucherMemberForm;
import cn.smile.bean.form.basic.voucher.QueryVouMemForm;
import cn.smile.commons.domain.IBaseService;
import cn.smile.commons.enums.basic.VoucherStatusEnum;
import com.baomidou.mybatisplus.core.metadata.IPage;

import java.util.List;
import java.util.Map;

public interface IVoucherMemberService extends IBaseService<VoucherMember> {

    /**
     * 新增会员代金券
     *
     * @param form 请求参数
     * @return 新增结果
     */
    Boolean addInfo(AddVoucherMemberForm form);

    /**
     * 分页查询会员优惠券
     *
     * @param form 查询参数
     * @return 查询结果集合
     */
    IPage<VoucherMemberDTO> getPage(QueryVouMemForm form);

    /**
     * 列表查询会员优惠券
     *
     * @param form 查询参数
     * @return 查询结果集合
     */
    List<VoucherMemberDTO> getList(QueryVouMemForm form);

    /**
     * 定时任务更新代金券状态
     */
    void updateStatus();

    /**
     * 统计代金券下发数量
     *
     * @param voucherIds 代金券ID集合
     * @return 统计结果
     */
    Map<String, Integer> countIssueNum(List<String> voucherIds);

    /**
     * 统计会员代金券数量(仅统计生效中并且未使用的)
     *
     * @param memberIds 会员ID
     * @return 统计结果
     */
    Map<String, Integer> countNumByMember(List<String> memberIds);

    /**
     * 获取会员指定消费项目可用代金券数量
     *
     * @param memberId 会员ID
     * @param itemId   消费项目ID
     * @return 可用代金券数量
     */
    Integer usableNum(String memberId, String itemId);

    /**
     * 根据代金券ID查询代金券信息
     *
     * @param id 代金券ID
     * @return 代金券信息
     */
    VoucherMemberDTO getInfoById(String id);

    /**
     * 更新代金券状态
     *
     * @param id     代金券ID
     * @param status 待更新的状态
     * @return 更新结果
     */
    Boolean updateVoucherStatus(String id, VoucherStatusEnum status);

    /**
     * 根据充值记录删除代金券信息
     *
     * @param topUpId 充值记录
     */
    void delByTopUpId(String topUpId);

    /**
     * 根据充值ID集合统计代金券数量
     *
     * @param topUpIds 充值记录ID集合
     * @return 统计结果
     */
    Map<String, Integer> countNumByTopUpIds(List<String> topUpIds);

    /**
     * 统计会员代金券发放数量
     *
     * @param timeStart 统计开始时间
     * @param timeEnd   统计结束时间
     * @return 发放数量
     */
    Integer countSendVouMemNum(String timeStart, String timeEnd);

    /**
     * 统计会员代金券使用数量
     *
     * @param timeStart 统计开始时间
     * @param timeEnd   统计结束时间
     * @return 使用数量
     */
    Integer countUseVouMemNum(String timeStart, String timeEnd);
}
